class Solution {
public:
    int minSubarray(vector<int>& nums, int p) {
        int n=nums.size(), sum[n+1];
        sum[0]=0;
        for(int i=0; i<n; i++) sum[i+1]=(sum[i]+nums[i])%p; //计算前缀和

        int x=sum[n];
        if(x==0) return 0;

        int ans=n;
        unordered_map<int, int> last;
        for(int i=0; i<=n; i++) {
            last[sum[i]]=i; //计算后缀对应的下标
            auto it=last.find((sum[i]-x+p)%p); //需要移除的和
            if(it!=last.end()) ans=min(ans, i-it->second);
        }
        return ans<n?ans:-1;
    }
};